<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>数字字符串</title>
<link media="all" rel="stylesheet" type="text/css" href="styles/03e73060321a0a848018724a6c83de7f-theme-base.css" />
<link media="all" rel="stylesheet" type="text/css" href="styles/03e73060321a0a848018724a6c83de7f-theme-medium.css" />

 </head>
 <body class="docs"><div class="navbar navbar-fixed-top">
  <div class="navbar-inner clearfix">
    <ul class="nav" style="width: 100%">
      <li style="float: left;"><a href="language.types.string.html">« String 字符串</a></li>
      <li style="float: right;"><a href="language.types.array.html">Array 数组 »</a></li>
    </ul>
  </div>
</div>
<div id="breadcrumbs" class="clearfix">
  <ul class="breadcrumbs-container">
    <li><a href="index.html">PHP Manual</a></li>
    <li><a href="language.types.html">类型</a></li>
    <li>数字字符串</li>
  </ul>
</div>
<div id="layout">
  <div id="layout-content"><div id="language.types.numeric-strings" class="sect1">
 <h2 class="title">数字字符串</h2>
 <p class="para">
  如果一个 PHP <span class="type">string</span> 可以被解释为 <span class="type">int</span> 或 <span class="type">float</span> 类型，则它被视为数字字符串。
 </p>

 <p class="para">
  PHP 8.0.0 正式可用：
 </p>

 <div class="informalexample">
  <div class="example-contents">
   <div class="cdata"><pre>
WHITESPACES      \s*
LNUM             [0-9]+
DNUM             ([0-9]*)[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM    (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
INT_NUM_STRING   {WHITESPACES} [+-]? {LNUM} {WHITESPACES}
FLOAT_NUM_STRING {WHITESPACES} [+-]? ({DNUM} | {EXPONENT_DNUM}) {WHITESPACES}
NUM_STRING       ({INT_NUM_STRING} | {FLOAT_NUM_STRING})
</pre></div>
  </div>

 </div>

 <p class="para">
  PHP 也有<em class="emphasis">前导</em>数字字符串的概念。
  这只是一个字符串，其开头类似于数字字符串，后跟任何字符。
 </p>

 <blockquote class="note"><p><strong class="note">注意</strong>: 
  <p class="para">
   任何包含字母 <code class="literal">E</code>
   周围是数字的字符串都将视为以科学计数法表示的数字。这会产生意想不到的效果。
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />var_dump</span><span style="color: #007700">(</span><span style="color: #DD0000">"0D1"&nbsp;</span><span style="color: #007700">==&nbsp;</span><span style="color: #DD0000">"000"</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//&nbsp;false,&nbsp;"0D1"&nbsp;不是科学计数法<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #DD0000">"0E1"&nbsp;</span><span style="color: #007700">==&nbsp;</span><span style="color: #DD0000">"000"</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//&nbsp;true,&nbsp;"0E1"&nbsp;is&nbsp;0&nbsp;*&nbsp;(10&nbsp;^&nbsp;1),&nbsp;or&nbsp;0<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #DD0000">"2E1"&nbsp;</span><span style="color: #007700">==&nbsp;</span><span style="color: #DD0000">"020"</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//&nbsp;true,&nbsp;"2E1"&nbsp;is&nbsp;2&nbsp;*&nbsp;(10&nbsp;^&nbsp;1),&nbsp;or&nbsp;20<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

  </p>
 </p></blockquote>

 <div class="sect2" id="language.types.numeric-string.conversion">
  <h3 class="title">在数字上下文中使用的字符串</h3>
  <p class="para">
   当一个 <span class="type">string</span> 需要被当作一个数字计算时，（例如：算术运算， <span class="type">int</span> 
   类型声明等)，则采取以下步骤来确定结果：

   <ol type="1">
    <li class="listitem">
     <span class="simpara">
      如果 <span class="type">string</span> 是数字，当 <span class="type">string</span> 
      是整数字符串并且符合 <span class="type">int</span> 类型的范围限制（即是 PHP_INT_MAX 
      定义的值），则解析为 <span class="type">int</span> ，否则解析为 <span class="type">float</span> 。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      如果上下文允许前导数字和一个 <span class="type">string</span>，如果 <span class="type">string</span> 的前导部分是整数数字字符串且符合 <span class="type">int</span> 
      类型限制（由 <strong><code>PHP_INT_MAX</code></strong> 定义），则解析为 <span class="type">int</span> ，否则解析为 <span class="type">float</span> 。
      此外，还会导致 <strong><code>E_WARNING</code></strong> 级别的错误。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      如果 <span class="type">string</span> 不是数字，则会抛出一个 <span class="classname"><a href="class.typeerror.html" class="classname">TypeError</a></span> 的异常。
     </span>
    </li>
   </ol>
  </p>
 </div>

 <div class="sect2" id="language.types.numeric-string.prior">
  <h3 class="title"> PHP 8.0.0 之前的行为</h3>
  <p class="para">
   在 PHP 8.0.0 之前，
   只有在<em class="emphasis">前导</em>空格的时候，<span class="type">string</span> 才被认为是数字；如果它有<em class="emphasis">尾随</em>空格，则该字符串被视为是前导数字。
  </p>

  <p class="para">
   在 PHP 8.0.0 之前，当在数字上下文中使用字符串时，它将执行与上述相同的步骤，但有以下区别：
   <ul class="itemizedlist">
    <li class="listitem">
     <span class="simpara">
      使用前导数字字符串将导致 <strong><code>E_NOTICE</code></strong> 
      而不是 <strong><code>E_WARNING</code></strong> 错误。
     </span>
     </li>
    <li class="listitem">
     <span class="simpara">
      如果字符串不是数字，则会导致 <strong><code>E_WARNING</code></strong> 
      错误并返回 <code class="literal">0</code> 。
     </span>
    </li>
   </ul>
   在 PHP 7.1.0 之前，则既不会导致 <strong><code>E_NOTICE</code></strong>，也不会导致 <strong><code>E_WARNING</code></strong>。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$foo&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">1&nbsp;</span><span style="color: #007700">+&nbsp;</span><span style="color: #DD0000">"10.5"</span><span style="color: #007700">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;$foo&nbsp;是&nbsp;float&nbsp;(11.5)<br /></span><span style="color: #0000BB">$foo&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">1&nbsp;</span><span style="color: #007700">+&nbsp;</span><span style="color: #DD0000">"-1.3e3"</span><span style="color: #007700">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;$foo&nbsp;是&nbsp;float&nbsp;(-1299)<br /></span><span style="color: #0000BB">$foo&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">1&nbsp;</span><span style="color: #007700">+&nbsp;</span><span style="color: #DD0000">"bob-1.3e3"</span><span style="color: #007700">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;PHP&nbsp;8.0.0&nbsp;起产生&nbsp;TypeError；在此之前&nbsp;$foo&nbsp;是&nbsp;integer&nbsp;(1)<br /></span><span style="color: #0000BB">$foo&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">1&nbsp;</span><span style="color: #007700">+&nbsp;</span><span style="color: #DD0000">"bob3"</span><span style="color: #007700">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;PHP&nbsp;8.0.0&nbsp;起产生&nbsp;TypeError；在此之前&nbsp;$foo&nbsp;是&nbsp;integer&nbsp;(1)<br /></span><span style="color: #0000BB">$foo&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">1&nbsp;</span><span style="color: #007700">+&nbsp;</span><span style="color: #DD0000">"10&nbsp;Small&nbsp;Pigs"</span><span style="color: #007700">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;PHP&nbsp;8.0.0&nbsp;起，$foo&nbsp;是&nbsp;integer&nbsp;(11)，并且产生&nbsp;E_WARNING；在此之前产生&nbsp;E_NOTICE<br /></span><span style="color: #0000BB">$foo&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">4&nbsp;</span><span style="color: #007700">+&nbsp;</span><span style="color: #DD0000">"10.2&nbsp;Little&nbsp;Piggies"</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//&nbsp;PHP&nbsp;8.0.0&nbsp;起，$foo&nbsp;是&nbsp;float&nbsp;(14.2)，并且产生&nbsp;E_WARNING；在此之前产生&nbsp;E_NOTICE<br /></span><span style="color: #0000BB">$foo&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">"10.0&nbsp;pigs&nbsp;"&nbsp;</span><span style="color: #007700">+&nbsp;</span><span style="color: #0000BB">1</span><span style="color: #007700">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;PHP&nbsp;8.0.0&nbsp;起，$foo&nbsp;是&nbsp;float&nbsp;(11)，并且产生&nbsp;E_WARNING；在此之前产生&nbsp;E_NOTICE<br /></span><span style="color: #0000BB">$foo&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">"10.0&nbsp;pigs&nbsp;"&nbsp;</span><span style="color: #007700">+&nbsp;</span><span style="color: #0000BB">1.0</span><span style="color: #007700">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;PHP&nbsp;8.0.0&nbsp;起，$foo&nbsp;是&nbsp;float&nbsp;(11)，并且产生&nbsp;E_WARNING；在此之前产生&nbsp;E_NOTICE<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

  </div>
 </div>
</div></div></div></body></html>